//导入数据库操作模块
const db = require('../db/index.js')
//导入密码加密包
const bcrypt = require('bcryptjs')
//导入生成token的包
const jwt = require('jsonwebtoken')
//导入全局配置文件
const config = require('../config.js')
//导入用户路由处理函数模块
const fileUtils = require('../utils/file.js')

//注册新用户的处理函数
exports.register = (req, res) => {
    //获取客户端提交到服务器的用户数据
    const registerInfo = req.body
    //对表单数据进行合法性校验
    if (!registerInfo.username || !registerInfo.password || !registerInfo.realname) {
        return res.cc('必填项不能为空！')
    }

    //定义查询语句，查询用户名是否被占用
    const sqlStr = 'select * from users where username=?'
    db.query(sqlStr, registerInfo.username, (err, results) => {
        //查询出错
        if (err) {
            return res.cc(err)
        }
        //用户名重复
        if (results.length > 0) {
            return res.cc('该用户名已被注册，请重新输入！')
        }

        //TODO: 用户名合法，对密码加密
        registerInfo.password = bcrypt.hashSync(registerInfo.password, 10)

        //定义插入新用户的sql语句
        const insertUser = 'insert into users set ?'
        db.query(
            insertUser,
            {
                username: registerInfo.username,
                password: registerInfo.password,
                realname: registerInfo.realname,
            },
            (err, results) => {
                // 执行 SQL 语句失败
                if (err) {
                    return res.cc(err)
                }
                //SQL语句执行成功，但影响行数不为1
                if (results.affectedRows !== 1) {
                    return res.cc('注册用户失败，请稍后再试!')
                }
                // 注册成功
                res.cc('注册成功!', 200)
            },
        )
    })
}

//登录的处理函数
exports.login = (req, res) => {
    //获取客户端提交到服务器的用户数据
    const userInfo = req.body
    //对表单数据进行合法性校验
    if (!userInfo.username || !userInfo.password) {
        return res.cc('用户名或密码不能为空！')
    }
    //定义查询语句，查询用户名是否存在
    const sqlStr = 'select * from users where username=?'
    //执行sql语句，查询用户数据
    db.query(sqlStr, userInfo.username, (err, results) => {
        //查询出错
        if (err) {
            return res.cc(err)
        }
        //登录失败
        if (results.length !== 1) {
            return res.cc('查询不到对应的用户信息')
        }

        //TODO: 判断用户名、密码是否正确
        //拿着用户输入的用户名,和数据库中存储的用户名进行对比
        if (userInfo.username !== results[0].username) {
            return res.cc('用户名错误，登录失败!')
        }
        //拿着用户输入的密码,和数据库中存储的密码进行对比
        const compareResult = bcrypt.compareSync(userInfo.password, results[0].password)
        //如果对比的结果等于false，则证明用户输入的密码错误
        if (!compareResult) {
            return res.cc('密码错误，登录失败!')
        }

        //T0D0:登录成功，生成Token 字符串
        const user = { ...results[0], password: '', avatar: results[0].avatar }
        // 对用户的信息进行加密，生成token字符串
        const tokenStr = jwt.sign(user, config.jwtSecretKey, {
            expiresIn: config.expiresIn,
        })
        //调用res.send将token相应给客户端
        res.send({
            code: 200,
            message: '登录成功',
            data: { token: 'Bearer ' + tokenStr },
        })
    })
}

// 退出登录
exports.logout = (req, res) => {
    // 服务器端可以选择不执行任何操作，只是向客户端返回一个成功的响应。
    res.cc('退出登录成功！', 200)
}

//更改头像
exports.editAvatar = (req, res) => {
    //获取客户端提交到服务器的图片数据
    const avatarData = req.body
    //对数据进行合法性校验
    if (!avatarData.newAvatar) {
        return res.cc('未获取到修改的头像信息')
    }

    const avatarUrl = `/chatAppServer/avatar/${Date.now()}-${avatarData.userId}.png`
    fileUtils.saveFileToDir(avatarUrl, avatarData.newAvatar)

    const queryUser = 'select * from users where userId=?'
    db.query(queryUser, avatarData.userId, (err, result) => {
        //查询出错
        if (err) {
            return res.cc(err)
        }
        //找不到该用户
        if (result.length !== 1) {
            return res.cc('找不到该用户')
        }

        const changeAvatarStr = 'update users set avatar=? where userId=?'
        db.query(changeAvatarStr, [avatarUrl, avatarData.userId], (err, result) => {
            // 执行 SQL 语句失败
            if (err) {
                console.log(err)
                return res.cc(err)
            }
            //SQL语句执行成功，但影响行数不为1
            if (result.affectedRows !== 1) {
                return res.cc('头像修改失败，请稍后再试!')
            }

            res.send({
                code: 200,
                message: '头像修改成功!',
                data: `${config.host}:${config.port}` + avatarUrl,
            })
        })
    })
}
